package com.wy.service;

import java.util.List;
import java.util.Objects;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import com.wy.base.AbstractService;
import com.wy.crypto.CryptoUtils;
import com.wy.enums.RedisKey;
import com.wy.mappers.UserMapper;
import com.wy.model.Role;
import com.wy.model.User;
import com.wy.model.UserEx;
import com.wy.properties.ConfigProperties;
import com.wy.result.ResultException;
import com.wy.utils.ListUtils;
import com.wy.utils.StrUtils;

@Service
public class UserService extends AbstractService<User> {

	@Autowired
	private UserMapper userMapper;

	@Autowired
	private ConfigProperties configProperties;

	@Autowired
	private RedisTemplate<Object, Object> redisTemplate;

	public User login(String account, String password) {
		User user = userMapper.login(account, password);
		if (user == null) {
			throw new ResultException("用户名或密码错误,请重新输入");
		}
		List<Role> roles = user.getRoles();
		if (ListUtils.isBlank(roles)) {
			throw new ResultException("该用户尚未分配角色,请联系管理员");
		}
		if (Objects.nonNull(
				redisTemplate.opsForValue().get(RedisKey.USER.getType() + user.getUserId()))) {
			throw new ResultException("用户已经登录!");
		}
		String token = CryptoUtils.UUID();
		user.setToken(token);
		if (configProperties.getCommon().getFilterLogin()) {
			redisTemplate.opsForValue().set(RedisKey.USER.getType() + user.getUserId(), token);
		}
		return user;
	}

	@Override
	public Object create(User model) {
		if (hasValue("username", model.getUsername())) {
			throw new ResultException("用户名" + model.getUsername() + "已存在");
		}
		if (hasValue("userphone", model.getUserphone())) {
			throw new ResultException("手机号" + model.getUserphone() + "已存在");
		}
		if (hasValue("idcard", model.getIdcard())) {
			throw new ResultException("身份照号" + model.getIdcard() + "已存在");
		}
		if (hasValue("email", model.getEmail())) {
			throw new ResultException("邮箱号" + model.getEmail() + "已存在");
		}
		if (StrUtils.isBlank(model.getPassword())) {
			model.setPassword("123456");
		}
		super.create(model);
		UserEx ex = model.getUserEx();
		if (ex != null) {
			ex.setUserId(model.getUserId());
			userMapper.create(ex);
		}
		return model;
	}

	public boolean logout(String token) {
		return true;
	}
	//
	// @Override
	// public Integer update(User model) {
	// UserEx ex = model.getEx();
	// if (ex != null) {
	// if (Strings.isBlank(ex.getUserID())) {
	// ex.setUserID(model.getUserID());
	// }
	// if (userDao.hasValue("HBYXJC..ti_User_Ex", "UserID", model.getUserID())) {
	// userDao.getDao().update(ex);
	// } else {
	// userDao.getDao().insert(ex);
	// }
	// }
	// return userDao.getDao().update(model);
	// }
	//
	// @Transactional
	// public int editPwd(Map<String, String> param) {
	// String userToken = param.get("userToken");
	// if (StrUtils.isBlank(userToken)) {
	// throw new ResultException("用户未登录");
	// }
	// String password = Strings.isBlank(param.get("password")) ? "123456" :
	// param.get("password");
	// return userDao.getDao().update(User.class, Chain.make("Password", password),
	// Cnd.where(Exps.eq("UserID", param.get("userID"))));
	// }
	//
	// @Override
	// public User getById(Serializable id) {
	// User user = userDao.getDao().fetch(User.class, id.toString());
	// if (user != null) {
	// user.setEx(userDao.getDao().fetch(UserEx.class, id.toString()));
	// }
	// return user;
	// }
	//
	// public List<Map<String, Object>> getMenus(String userId, int TypeId) {
	// String userPhone = userDao
	// .getStr(Sqls.create("select UserPhone from HBYXJC..ti_User where UserID =
	// @ID").setParam("ID", userId));
	// if (userPhone == null) {
	// return null;
	// }
	// boolean isAdmin = Constant.ADMIN_ID.equals(userPhone);
	// String parentId = userDao
	// .getStr(Sqls.create("select MenuID from HBYXJC..ti_Menu where ParentID = '0'
	// and MenuType = 1"));
	// List<Map<String, Object>> menus = getChildMenu(isAdmin, userId, parentId,
	// TypeId);
	// if (menus == null || menus.isEmpty())
	// return null;
	// addChildMenu(isAdmin, userId, menus, TypeId);
	// return menus;
	// }
	//
	// private void addChildMenu(boolean isAdmin, String userId, List<Map<String,
	// Object>> maps, int TypeId) {
	// for (Map<String, Object> map : maps) {
	// String menuId = (String) map.get("MenuID");
	// if ((Integer) map.remove("BtnNum") > 0)
	// map.put("Button", getMenuButton(isAdmin, userId, menuId));
	// if ((Integer) map.remove("ChildNum") > 0) {
	// List<Map<String, Object>> childs = getChildMenu(isAdmin, userId, menuId,
	// TypeId);
	// addChildMenu(isAdmin, userId, childs, TypeId);
	// map.put("Child", childs);
	// }
	// }
	// }
	//
	// /**
	// * 查询获取菜单的子菜单列表
	// * @param isAdmin 是否超级管理员
	// * @param userId 用户编号
	// * @param menuId 菜单编号
	// * @return
	// */
	// private List<Map<String, Object>> getChildMenu(boolean isAdmin, String
	// userId, String menuId, int TypeId) {
	// List<Map<String, Object>> menus;
	// if (isAdmin) {
	// String sql = "select a.MenuID,a.MenuName,a.NavigateUrl,a.SystemType,(select
	// count(*) from"
	// + " HBYXJC..ti_Button b where b.MenuID = a.MenuID) BtnNum,(select count(*)"
	// + " from HBYXJC..ti_Menu c where c.ParentID = a.MenuID) ChildNum from
	// HBYXJC..ti_Menu"
	// + " a where a.ParentID = @MID and a.SystemType=@TypeId order by a.SortIndex";
	// menus = userDao.getMaps(Sqls.create(sql).setParam("MID",
	// menuId).setParam("TypeId", TypeId));
	// } else {
	// String sql = "select a.MenuID,a.MenuName,a.NavigateUrl,a.SystemType,(select
	// count(*) from"
	// + " HBYXJC..ti_Button d where d.MenuID = a.MenuID) BtnNum,(select count(*)
	// from"
	// + " HBYXJC..ti_Menu e where e.ParentID = a.MenuID) ChildNum from
	// HBYXJC..ti_Menu a inner"
	// + " join HBYXJC..tr_Role_Menu b on a.MenuID = b.MenuID inner join
	// tr_User_Role c"
	// + " on b.RoleID = c.RoleID where c.UserID = @UID and a.ParentID = @MID and
	// a.SystemType=@TypeId"
	// + " order by a.SortIndex";
	// menus = userDao.getMaps(
	// Sqls.create(sql).setParam("UID", userId).setParam("MID",
	// menuId).setParam("TypeId", TypeId));
	// }
	// return menus;
	// }
	//
	// /**
	// * 获取菜单对应的按钮列表信息
	// * @param isAdmin 是否超级管理员
	// * @param userId 用户编号
	// * @param menuId 菜单编号
	// * @return
	// */
	// private List<Map<String, Object>> getMenuButton(boolean isAdmin, String
	// userId, String menuId) {
	// List<Map<String, Object>> buttons;
	// if (isAdmin) {
	// String sql = "select ButtonID,BtnName,BtnType,1 IsCheck from
	// HBYXJC..ti_Button"
	// + " where MenuID = @MID order by SortIndex";
	// buttons = userDao.getMaps(Sqls.create(sql).setParam("MID", menuId));
	// } else {
	// String sql = "select a.ButtonID,a.BtnName,a.BtnType,ISNULL((select 1"
	// + " from HBYXJC..tr_Role_Button b inner join HBYXJC..tr_User_Role c on
	// c.RoleID"
	// + " = b.RoleID where b.ButtonID = a.ButtonID and c.UserID ="
	// + " @UID),0) IsCheck from HBYXJC..ti_Button a where a.MenuID = @MID" + "
	// order by a.SortIndex";
	// buttons = userDao.getMaps(Sqls.create(sql).setParam("UID",
	// userId).setParam("MID", menuId));
	// }
	// return buttons;
	// }
	//
	//
	// public Map<String, Object> getRelation(String userId) {
	// String sqlStr = "select a.UserID,a.OrganizationID,a.DepartmentID,b.RoleID
	// from HBYXJC..ti_User a"
	// + " left join HBYXJC..tr_User_Role b on a.UserID = b.UserID where a.UserID =
	// @Id";
	// return userDao.getMap(Sqls.create(sqlStr).setParam("Id", userId));
	// }
	//
	// public int editRelation(Map<String, String> data) {
	// String roleId = data.get("roleID");
	// if (Strings.isNotBlank(roleId)) {
	// UserRole userRole = getBaseDao().fetchx(UserRole.class, data.get("userID"),
	// roleId);
	// if (userRole == null) {
	// userRole = new UserRole();
	// userRole.setUserID(data.get("userID"));
	// userRole.setRoleID(roleId);
	// getBaseDao().insert(userRole);
	// } else if (!userRole.getRoleID().equals(roleId)) {
	// userRole.setRoleID(roleId);
	// getBaseDao().update(userRole);
	// }
	// } else {
	// getBaseDao().delete(UserRole.class, data.get("userID"));
	// }
	// return getBaseDao().update(User.class,
	// Chain.make("OrganizationID", data.get("organizationID")).add("DepartmentID",
	// data.get("departmentID")),
	// Cnd.where(Exps.eq("UserID", data.get("userID"))));
	// }
}